جزوه · فصل هفتم · جلسه ۶۹ · پیاده‌سازی sudo و su ← بازگشت به فهرست
📘 فصل هفتم · جلسه ۶۹ پیاده‌سازی sudo و su
📅 تاریخ: یکشنبه، ۱ شهریور ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
این جلسه یکی از مهم‌ترین مباحث امنیتی در لینوکس است. تفاوت su و sudo و نحوه پیکربندی sudoers حتماً در آزمون می‌آید.
🔑 قبل از شروع، یه مثال ساده:

فرض کن مدیر یه ساختمان هستی و کلید همه درها رو داری. اما نمی‌خوای همه کارمندان کلید اصلی رو داشته باشن. به جاش، به هر کدوم یه **کارت دسترسی** می‌دی که فقط به درهای خاصی اجازه ورود بده. توی لینوکس، su مثل کلید اصلی (رفتن به کاربر root) و sudo مثل کارت دسترسی (اجرای دستورات خاص با مجوز root) است. این جلسه بهت یاد میده چطور این ابزارها رو مدیریت کنی.

▍ مقدمه

در لینوکس، برای انجام کارهای مدیریتی (نصب نرم‌افزار، تغییر تنظیمات سیستم، مدیریت کاربران و ...) به دسترسی root نیاز دارید. اما استفاده مستقیم از کاربر root خطرناک است و می‌تواند به سیستم آسیب بزند. به همین دلیل، دو ابزار اصلی برای مدیریت دسترسی root وجود دارد:

⚠️ هشدار امنیتی:

هرگز با کاربر root به‌طور مستقیم کار نکنید. همیشه از یک کاربر معمولی استفاده کنید و فقط در صورت نیاز از sudo استفاده کنید.

▍ دستور su (Switch User)

su به شما اجازه می‌دهد به کاربر دیگری (معمولاً root) تغییر هویت دهید. با اجرای su بدون آرگومان، به کاربر root تغییر می‌کنید و باید رمز root را وارد کنید.

┌──(ya3in㉿kali)-[~] └─$ su Password: (رمز root را وارد کنید) root@kali:/home/ya3in#

توضیح: با su به کاربر root تغییر هویت می‌دهید. پرامپت به # تغییر می‌کند که نشان‌دهنده دسترسی root است.

┌──(ya3in㉿kali)-[~] └─$ su - Password: (رمز root را وارد کنید) root@kali:~#

توضیح: su - علاوه بر تغییر کاربر، محیط کاربر (متغیرهای محیطی، مسیرها و ...) را نیز به root تغییر می‌دهد.

تفاوت su و su -:
  • su → فقط کاربر را تغییر می‌دهد (محیط کاربری قبلی باقی می‌ماند).
  • su - → کاربر و محیط کاربری (HOME, PATH, ...) را تغییر می‌دهد.
┌──(ya3in㉿kali)-[~] └─$ su - ali Password: (رمز کاربر ali را وارد کنید) ali@kali:~$

توضیح: به کاربر ali تغییر هویت می‌دهد (با رمز عبور ali).

• معایب su

معایب su: نیاز به دانستن رمز root، عدم وجود لاگ دقیق، اجرای همه دستورات با دسترسی root.

▍ دستور sudo (Superuser Do)

sudo به کاربران مجاز اجازه می‌دهد تا یک دستور خاص را با دسترسی root (یا کاربر دیگر) اجرا کنند، بدون اینکه نیاز به دانستن رمز root داشته باشند. کاربر باید رمز خودش را وارد کند.

┌──(ya3in㉿kali)-[~] └─$ sudo apt update [sudo] password for ya3in: (رمز خودتان را وارد کنید)

توضیح: با sudo می‌توانید apt update را با دسترسی root اجرا کنید.

🔑 مزایای sudo:
  • نیازی به دانستن رمز root نیست.
  • می‌توان دسترسی را محدود کرد (فقط دستورات خاص).
  • لاگ (Log) تمام دستورات اجرا شده با sudo ذخیره می‌شود.
  • امکان تفکیک دسترسی بین کاربران مختلف.

▍ فایل پیکربندی /etc/sudoers

فایل /etc/sudoers مشخص می‌کند که کدام کاربران می‌توانند از sudo استفاده کنند و چه دستوراتی را می‌توانند اجرا کنند. این فایل را هرگز مستقیم ویرایش نکنید. برای ویرایش از دستور visudo استفاده کنید.

┌──(ya3in㉿kali)-[~] └─$ sudo visudo

توضیح: visudo فایل /etc/sudoers را با یک ویرایشگر امن باز می‌کند و قبل از ذخیره، خطاهای نحوی را بررسی می‌کند.

⚠️ هشدار:

هرگز /etc/sudoers را با ویرایشگر معمولی (مثل nano) ویرایش نکنید. اگر خطایی در فایل وجود داشته باشد، ممکن است دسترسی sudo را برای همیشه از دست بدهید! همیشه از visudo استفاده کنید.

• ساختار فایل sudoers

خطوط اصلی در فایل sudoers به این شکل هستند:

username ALL=(ALL:ALL) ALL # کاربر می‌تواند همه دستورات را با sudo اجرا کند %groupname ALL=(ALL:ALL) ALL # همه کاربران گروه می‌توانند همه دستورات را با sudo اجرا کنند username ALL=(ALL:ALL) /usr/bin/apt # کاربر فقط می‌تواند دستور apt را با sudo اجرا کند
ساختار خطوط sudoers: کاربر/گروه میزبان=(کاربر:گروه) دستورات

• مثال‌های متداول sudoers

خط در sudoers توضیح
ali ALL=(ALL:ALL) ALL کاربر ali می‌تواند همه دستورات را با sudo اجرا کند.
%admin ALL=(ALL:ALL) ALL همه کاربران گروه admin می‌توانند همه دستورات را با sudo اجرا کنند.
ali ALL=(ALL:ALL) /usr/bin/apt, /usr/bin/systemctl کاربر ali فقط می‌تواند apt و systemctl را با sudo اجرا کند.
ali ALL=(ALL:ALL) NOPASSWD: /usr/bin/apt کاربر ali می‌تواند apt را با sudo بدون نیاز به رمز عبور اجرا کند.
با NOPASSWD می‌توانید به کاربران اجازه دهید بدون وارد کردن رمز عبور، از sudo استفاده کنند. این کار برای اسکریپت‌های خودکار مفید است اما امنیت را کاهش می‌دهد.

▍ دستورات مفید با sudo

┌──(ya3in㉿kali)-[~] └─$ sudo -l User ya3in may run the following commands on kali: (ALL : ALL) ALL

توضیح: sudo -l لیست دستوراتی که کاربر فعلی می‌تواند با sudo اجرا کند را نمایش می‌دهد.

┌──(ya3in㉿kali)-[~] └─$ sudo -u ali whoami ali

توضیح: sudo -u ali دستور را به عنوان کاربر ali اجرا می‌کند (نه root).

▍ مقایسه su و sudo

🔴 su

  • نیاز به رمز root دارد.
  • همه دستورات با دسترسی root اجرا می‌شوند.
  • لاگ (Log) دقیقی از دستورات ندارد.
  • مناسب برای تغییر کامل کاربر.
  • استفاده از آن خطرناک‌تر است.

🔵 sudo

  • نیاز به رمز خود کاربر دارد.
  • فقط دستور مشخص شده با دسترسی root اجرا می‌شود.
  • تمام دستورات در /var/log/auth.log لاگ می‌شوند.
  • مناسب برای اجرای دستورات خاص.
  • استفاده از آن امن‌تر است.
در آزمون معمولاً سوال می‌شود: «تفاوت su و sudo چیست؟» پاسخ: su نیاز به رمز root دارد و همه دستورات را با دسترسی root اجرا می‌کند، اما sudo نیاز به رمز خود کاربر دارد و فقط دستورات مشخص را با دسترسی root اجرا می‌کند.

▍ بهترین روش‌های امنیتی

✅ جمع‌بندی نهایی برای امتحان:
  • su: تغییر به کاربر دیگر (معمولاً root) با رمز root.
  • su -: تغییر کاربر و محیط کاربری.
  • sudo: اجرای دستور با دسترسی root با رمز خود کاربر.
  • /etc/sudoers: فایل پیکربندی sudo (با visudo ویرایش کنید).
  • sudo -l: نمایش دستورات قابل اجرا با sudo.
  • sudo -u user: اجرای دستور به عنوان کاربر دیگر.
  • لاگ sudo: /var/log/auth.log